﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using fb.component.contracts;
using fb.messages.contracts;

namespace fb.befragung
{
  public class Befragung : IBefragung
  {
    public Befragung()
      : this(null)
    {
    }

    internal Befragung(IFragebogen fragebogen)
    {
      this.Fragebogen = fragebogen;
    }

    public void In_Fragebogen(IFragebogen fragebogen)
    {
      Trace.WriteLine(string.Format("Fragebogen called Anzahl Gruppen:{0}", fragebogen.Gruppen.Count()));

      this.Fragebogen = fragebogen;

      var befragungsgruppeViewData = ErsteBefragungsGruppeErzeugen(this.Fragebogen, -1);

      Trace.WriteLine(string.Format("Output pin ViewDerAktuellenBefragungsGruppe called Gruppen name {0}", befragungsgruppeViewData.Name));
      this.Out_ViewDerAktuellenBefragungsGruppe(befragungsgruppeViewData);
    }

    private static BefragungsGruppeViewData ErsteBefragungsGruppeErzeugen(IFragebogen fragebogen, int gewählteAntwortMöglichkeitID)
    {
      var ersteGruppe = fragebogen.Gruppen.FirstOrDefault();

      var frageViewData
        = ersteGruppe.Fragen.Select(frage => new FrageViewData
          (frage.Text
          , frage.Antwortmöglichkeiten.Select(antwortmöglichkeit => new AntwortmöglichkeitViewData
            (antwortmöglichkeit.Text
            , antwortmöglichkeit.ID == gewählteAntwortMöglichkeitID
            , antwortmöglichkeit.ID
            ))
          ));


      //var frageViewData = new List<FrageViewData>();
      //foreach (var frage in ersteGruppe.Fragen)
      //{
      //  var antwortmöglichkeitenViewData = new List<AntwortmöglichkeitViewData>();

      //  foreach (var antwortmöglichkeit in frage.Antwortmöglichkeiten)
      //  {
      //    var istGewählt = antwortmöglichkeit.ID == gewählteAntwortMöglichkeitID;
      //    var antwortmöglichkeitViewData = new AntwortmöglichkeitViewData(antwortmöglichkeit.Text, istGewählt, antwortmöglichkeit.ID);
      //    antwortmöglichkeitenViewData.Add(antwortmöglichkeitViewData);
      //  }

      //  var frageViewData = new FrageViewData(frage.Text, antwortmöglichkeitenViewData);

      //  frageViewData.Add(frageViewData);
      //}

      return new BefragungsGruppeViewData(ersteGruppe.Name, 0, fragebogen.Gruppen.Count(), true, frageViewData);
    }

    protected IFragebogen Fragebogen { get; set;}

    public void In_AuswertungsAnfrage()
    {
      Trace.WriteLine(string.Format("AuswertungsAnfrage called"));
      throw new NotImplementedException();
    }

    public void In_GruppenAnfrage(int gruppenIndex)
    {
      Trace.WriteLine(string.Format("GruppenAnfrage called GruppenIndex:{0}", gruppenIndex));

      var befragungsgruppeViewData = ErsteBefragungsGruppeErzeugen(this.Fragebogen, -1);

      Trace.WriteLine(string.Format("Output pin ViewDerAktuellenBefragungsGruppe called Gruppen name {0}", befragungsgruppeViewData.Name));
      this.Out_ViewDerAktuellenBefragungsGruppe(befragungsgruppeViewData);
    }

    public void In_AntwortGegeben(int antwortmöglichkeitId)
    {
      Trace.WriteLine(string.Format("AntwortGegeben called AntwortmöglichkeitId:{0}", antwortmöglichkeitId));
      
      var befragungsgruppeViewData = ErsteBefragungsGruppeErzeugen(this.Fragebogen, antwortmöglichkeitId);

      Trace.WriteLine(string.Format("Output pin ViewDerAktuellenBefragungsGruppe called Gruppen name {0}", befragungsgruppeViewData.Name));
      
      this.Out_ViewDerAktuellenBefragungsGruppe(befragungsgruppeViewData);
    }

    public Action<IBefragungsGruppeViewData> Out_ViewDerAktuellenBefragungsGruppe { set; get; }

  }
}
